home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / ORBMECHD / HOHMANN.C < prev    next >
Text File  |  1991-02-25  |  7KB  |  286 lines

  1. /********************************
  2.     Hohmann Transfer algorithm.
  3.  
  4.     8 August 1990
  5. ********************************/
  6.  
  7. #include     "orbmech.h"
  8. #include    "SANE.h"
  9. #include    "math.h"
  10. #define        HOHMANNREC_SIZE        80
  11.  
  12. /* globals */
  13.  
  14. extern    DialogPtr        LambertDia, HohmannDia, HillsDia, KeplerDia, whichDialog, gHelpDia;
  15. extern    EventRecord        gEvent;
  16. extern    TEHandle        TEH;
  17. extern    decform            gdecform;
  18. extern    int                dirty;                    
  19.  
  20. struct    ParamRec
  21.     {
  22.     extended    value;
  23.     Str255        name;
  24.     };
  25.     
  26. extern     struct    ParamRec    gParameter;
  27.  
  28. struct    HohmannRec
  29.     {
  30.     extended     rad_one, rad_two, flight_time;
  31.     extended     delta_v_initial, delta_v_final, delta_v_total;
  32.     extended    wedge, d_i_initial;
  33.     } ;
  34.     
  35. typedef        struct    HohmannRec    *HohmannPtr;
  36.     
  37.  
  38. /***********************************/
  39.  
  40. Hohmann()
  41. {
  42.     Handle        inputH, itemHandle;
  43.     Str255        r1Str, r2Str, dviStr, dvfStr, dvtStr, ftStr;
  44.     Str255        wedgeStr, diiStr;
  45.     int            itemType;
  46.     Rect        itemRect;
  47.     Boolean        dont_panic = 1, miFlag = 0, auFlag = 0, degFlag;
  48.     decimal        result;
  49.     
  50.     ControlHandle    kmSecBut, miHrBut, radBut;
  51.  
  52.     struct        HohmannRec    *Hdata;
  53.     
  54.     Ptr            temp;
  55.  
  56.     Str255        q, w, e, r, y, u, p, j, k, l, f, t;    
  57.     
  58.     temp = NewPtr( HOHMANNREC_SIZE );
  59.     
  60.     Hdata = ( HohmannPtr) temp;
  61.  
  62.     pStrCopy("\p\rHohmann Transfer ", q);
  63.     pStrCopy("\p\r     radius 1:     ", w);
  64.     pStrCopy("\p\r     radius 2:     ", e);
  65.     pStrCopy("\p\r     wedge angle:  ", f);
  66.     pStrCopy("\p\r     primary:      ", y);
  67.     pStrCopy("\p\r\rTransfer orbit Delta-V required ", u);
  68.     pStrCopy("\p\r     initial:       ", j);
  69.     pStrCopy("\p\r     final:         ", k);
  70.     pStrCopy("\p\r     total:         ", l);
  71.     pStrCopy("\p\r\rFlight time:           ", r);
  72.     pStrCopy("\p\r\rInitial plane change:  ", t);
  73.     pStrCopy("\p\r\r", p);
  74.  
  75.     GetDItem( HohmannDia, RAD_ONE, &itemType, &inputH, &itemRect);
  76.     GetIText( inputH, &r1Str );
  77.     Pstr_to_extended( &r1Str, &Hdata->rad_one, &dont_panic );
  78.     
  79.     GetDItem( HohmannDia, RAD_TWO, &itemType, &inputH, &itemRect);
  80.     GetIText( inputH, &r2Str );
  81.     Pstr_to_extended( &r2Str, &Hdata->rad_two, &dont_panic );
  82.  
  83.     GetDItem( HohmannDia, WEDGE, &itemType, &inputH, &itemRect);
  84.     GetIText( inputH, &wedgeStr );
  85.     Pstr_to_extended( &wedgeStr, &Hdata->wedge, &dont_panic );
  86.  
  87.     GetDItem ( HohmannDia, KM_SEC_O, &itemType, &kmSecBut, &itemRect);
  88.     GetDItem ( HohmannDia, MI_HR_O, &itemType, &miHrBut, &itemRect);
  89.     GetDItem ( HohmannDia, RAD_BUT2, &itemType, &radBut, &itemRect);
  90.     
  91.     if ( dont_panic )
  92.     {
  93.     
  94.     if ( ! GetCtlValue ( kmSecBut ) )
  95.         if ( GetCtlValue ( miHrBut ) ) {
  96.             Hdata->rad_one *=  MI_CONV;
  97.             Hdata->rad_two *=  MI_CONV;
  98.             miFlag = 1;
  99.         }
  100.         else {
  101.             Hdata->rad_one *=  AU_CONV;
  102.             Hdata->rad_two *=  AU_CONV;
  103.             auFlag = 1;
  104.         }    
  105.  
  106.     if ( ! GetCtlValue ( radBut ) )  {
  107.         Hdata->wedge /=  DEG_CONV;
  108.         degFlag = 1;
  109.         }
  110.         
  111.     TEInsert( q+1, *q, TEH );
  112.     TEInsert( w+1, *w, TEH );
  113.     TEInsert( r1Str+1, *r1Str, TEH );
  114.     TEInsert( e+1, *e, TEH );
  115.     TEInsert( r2Str+1, *r2Str, TEH );
  116.     TEInsert( f+1, *f, TEH );
  117.     TEInsert( wedgeStr+1, *wedgeStr, TEH );
  118.     TEInsert( y+1, *y, TEH );
  119.     TEInsert( gParameter.name+1, *gParameter.name, TEH );
  120.  
  121.     calcuateHohmann( Hdata );
  122.     
  123.     if ( miFlag )  {
  124.         Hdata->delta_v_initial /=  MI_CONV / HR_CONV;
  125.         Hdata->delta_v_final /=  MI_CONV / HR_CONV;
  126.         Hdata->delta_v_total /=  MI_CONV / HR_CONV;
  127.         Hdata->flight_time /= HR_CONV;
  128.     }
  129.     
  130.     if ( auFlag )  {
  131.         Hdata->delta_v_initial /=  AU_CONV / YR_CONV;
  132.         Hdata->delta_v_final /=  AU_CONV / YR_CONV;
  133.         Hdata->delta_v_total /=  AU_CONV / YR_CONV;
  134.         Hdata->flight_time /= YR_CONV;
  135.     }
  136.     
  137.     if ( Hdata->delta_v_initial > 9999.0 || Hdata->delta_v_initial <  .000001 ) 
  138.         gdecform.style = FLOATDECIMAL;
  139.     else
  140.         gdecform.style = FIXEDDECIMAL;
  141.     
  142.     num2dec( &gdecform, Hdata->delta_v_initial, &result );    
  143.     dec2str( &gdecform, &result, dviStr );
  144.  
  145.     if ( Hdata->delta_v_final > 9999.0 || Hdata->delta_v_final <  .000001 ) 
  146.         gdecform.style = FLOATDECIMAL;
  147.     else
  148.         gdecform.style = FIXEDDECIMAL;
  149.     
  150.     num2dec( &gdecform, Hdata->delta_v_final, &result );    
  151.     dec2str( &gdecform, &result, dvfStr );
  152.  
  153.     if ( Hdata->delta_v_total > 9999.0 || Hdata->delta_v_total <  .000001 ) 
  154.         gdecform.style = FLOATDECIMAL;
  155.     else
  156.         gdecform.style = FIXEDDECIMAL;
  157.     
  158.     num2dec( &gdecform, Hdata->delta_v_total, &result );    
  159.     dec2str( &gdecform, &result, dvtStr );
  160.  
  161.     if ( Hdata->flight_time > 9999.0 || Hdata->flight_time <  .000001 ) 
  162.         gdecform.style = FLOATDECIMAL;
  163.     else
  164.         gdecform.style = FIXEDDECIMAL;
  165.     
  166.     num2dec( &gdecform, Hdata->flight_time, &result );    
  167.     dec2str( &gdecform, &result, ftStr );
  168.  
  169.     if ( degFlag ) 
  170.         Hdata->d_i_initial *=  DEG_CONV;
  171.  
  172.     if ( Hdata->d_i_initial > 9999.0 || Hdata->d_i_initial <  .000001 ) 
  173.         gdecform.style = FLOATDECIMAL;
  174.     else
  175.         gdecform.style = FIXEDDECIMAL;
  176.     
  177.     num2dec( &gdecform, Hdata->d_i_initial, &result );    
  178.     dec2str( &gdecform, &result, diiStr );
  179.  
  180.     TEInsert( u+1, *u, TEH );
  181.     TEInsert( j+1, *j, TEH );
  182.     TEInsert( dviStr+1, *dviStr, TEH );
  183.     TEInsert( k+1, *k, TEH );
  184.     TEInsert( dvfStr+1, *dvfStr, TEH );
  185.     TEInsert( l+1, *l, TEH );
  186.     TEInsert( dvtStr+1, *dvtStr, TEH );
  187.     TEInsert( r+1, *r, TEH );
  188.     TEInsert( ftStr+1, *ftStr, TEH );
  189.     TEInsert( t+1, *t, TEH );
  190.     TEInsert( diiStr+1, *diiStr, TEH );
  191.     TEInsert( p+1, *p, TEH );
  192.  
  193.     dirty = 1;
  194.     
  195.     GetDItem( HohmannDia, D_V_I, &itemType, &itemHandle, &itemRect);
  196.     SetIText( itemHandle, dviStr );
  197.     
  198.     GetDItem( HohmannDia, D_V_F, &itemType, &itemHandle, &itemRect);
  199.     SetIText( itemHandle, dvfStr );
  200.     
  201.     GetDItem( HohmannDia, D_V_T, &itemType, &itemHandle, &itemRect);
  202.     SetIText( itemHandle, dvtStr );
  203.     
  204.     GetDItem( HohmannDia, FLT_T, &itemType, &itemHandle, &itemRect);
  205.     SetIText( itemHandle, ftStr );
  206.     
  207.     GetDItem( HohmannDia, D_I_INITIAL, &itemType, &itemHandle, &itemRect);
  208.     SetIText( itemHandle, diiStr );
  209.     
  210.     ShowSelect();
  211.     
  212.     }
  213. }
  214.  
  215.  
  216. extended    deltaV( va, vb, w )
  217. extended    va, vb, w;
  218. {
  219.     extended    value;
  220.     
  221.     value = sqrt( va*va + vb*vb - 2.0 * va * vb * cos( w ) );
  222.     
  223.     return( value );
  224. }
  225.  
  226. calcuateHohmann( Hdata )
  227. struct    HohmannRec    *Hdata;
  228. {
  229.     extended    guess, dit, dvg, var, dvl, dvh;
  230.     Boolean        converged;
  231.     extended    r1, r2, mu, v1, v2, vp, va, a;
  232.     extended    deltaV();
  233.     
  234.     r1 = Hdata->rad_one;
  235.     
  236.     r2 = Hdata->rad_two;
  237.     
  238.     dit = Hdata->wedge;
  239.     
  240.     a = ( r1 + r2 ) / 2;
  241.     
  242.     mu = gParameter.value;
  243.     
  244.     v1 = sqrt( mu / r1 );
  245.     
  246.     v2 = sqrt( mu / r2 );
  247.     
  248.     vp = sqrt( mu * r2 / a / r1 );
  249.     
  250.     va = sqrt( mu * r1 / a / r2 );
  251.     
  252.     guess = dit / 8.0;
  253.     
  254.     var = START_VAR;
  255.     
  256.     converged = 0;
  257.     
  258.     while ( ! converged ) {
  259.         
  260.         dvg = deltaV( v1, vp, guess ) + deltaV( v2, va, (dit-guess) );
  261.         
  262.         dvl = deltaV( v1, vp, (guess-var) ) + deltaV( v2, va, (dit-guess+var) );
  263.         
  264.         dvh = deltaV( v1, vp, (guess+var) ) + deltaV( v2, va, (dit-guess-var) );
  265.         
  266.         if ( dvg > dvh )
  267.             guess += var;
  268.         else  if ( dvg > dvl )
  269.             guess -= var;
  270.         else
  271.             var /= 2.0;
  272.         
  273.         if ( var < .000001 )
  274.             converged = 1;
  275.     }
  276.     
  277.     Hdata->delta_v_initial = deltaV( v1, vp, guess );
  278.     
  279.     Hdata->delta_v_final = deltaV( v2, va, (dit-guess) );
  280.     
  281.     Hdata->delta_v_total = Hdata->delta_v_initial + Hdata->delta_v_final;
  282.     
  283.     Hdata->flight_time = sqrt( a * a * a / mu ) * PI_VALUE;
  284.     
  285.     Hdata->d_i_initial = guess;
  286. }